home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / var / lib / python-support / python2.6 / glchess / display.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2009-04-20  |  22.1 KB  |  642 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. __author__ = 'Robert Ancell <bob27@users.sourceforge.net>'
  5. __license__ = 'GNU General Public License Version 2'
  6. __copyright__ = 'Copyright 2005-2006  Robert Ancell'
  7. import config
  8. import player
  9. import scene
  10. import scene.cairo as scene
  11. import scene.opengl as scene
  12. import scene.human as scene
  13. import ui
  14. import game
  15. import chess.board as chess
  16.  
  17. class MovePlayer(game.ChessPlayer):
  18.     '''This class provides a pseudo-player to watch for piece movements'''
  19.     
  20.     def __init__(self, view):
  21.         """Constructor for a move player.
  22.         
  23.         'view' is the view to update
  24.         """
  25.         self.view = view
  26.         game.ChessPlayer.__init__(self, '@view')
  27.  
  28.     
  29.     def onPieceMoved(self, piece, start, end, delete):
  30.         '''Called by chess.board.ChessPlayer'''
  31.         if self.view.moveNumber != -1:
  32.             return None
  33.         animate = self.view.game.isStarted()
  34.         p = self.view.scene.movePiece(piece, end, delete, animate)
  35.         if animate and self.view.moveNumber == -1 and start is not None and start != end:
  36.             self.view.scene.waitingPiece = p
  37.         
  38.  
  39.     
  40.     def onPlayerMoved(self, p, move):
  41.         self.view._redrawHighlight()
  42.  
  43.     
  44.     def onPlayerStartTurn(self, player):
  45.         self.view._redrawHighlight()
  46.  
  47.  
  48.  
  49. class CairoPiece(scene.ChessPieceFeedback):
  50.     '''
  51.     '''
  52.     model = None
  53.     location = ''
  54.     
  55.     def __init__(self, scene, piece):
  56.         self.scene = scene
  57.         self.piece = piece
  58.  
  59.     
  60.     def onDeleted(self):
  61.         '''Called by scene.ChessPieceFeedback'''
  62.         self.scene.pieces.pop(self.piece)
  63.  
  64.     
  65.     def onMoved(self):
  66.         '''Called by scene.ChessPieceFeedback'''
  67.         self.scene.view._pieceMoved(self)
  68.  
  69.  
  70.  
  71. class SceneCairo(scene.SceneFeedback, scene.human.SceneHumanInput):
  72.     '''
  73.     '''
  74.     controller = None
  75.     game = None
  76.     pieces = None
  77.     waitingPiece = None
  78.     
  79.     def __init__(self, view):
  80.         '''
  81.         '''
  82.         self.view = view
  83.         self.controller = scene.cairo.Scene(self)
  84.         self.game = view.game
  85.         self.pieces = { }
  86.         scene.human.SceneHumanInput.__init__(self)
  87.  
  88.     
  89.     def getPieces(self):
  90.         return self.pieces.values()
  91.  
  92.     
  93.     def movePiece(self, piece, location, delete, animate):
  94.         '''
  95.         '''
  96.         
  97.         try:
  98.             p = self.pieces[piece]
  99.         except KeyError:
  100.             pieceName = {
  101.                 chess.board.PAWN: 'pawn',
  102.                 chess.board.ROOK: 'rook',
  103.                 chess.board.KNIGHT: 'knight',
  104.                 chess.board.BISHOP: 'bishop',
  105.                 chess.board.QUEEN: 'queen',
  106.                 chess.board.KING: 'king' }[piece.getType()]
  107.             chessSet = {
  108.                 chess.board.WHITE: 'white',
  109.                 chess.board.BLACK: 'black' }[piece.getColour()]
  110.             p = CairoPiece(self, piece)
  111.             p.model = self.controller.addChessPiece(chessSet, pieceName, location, p)
  112.             self.pieces[piece] = p
  113.  
  114.         p.location = location
  115.         p.model.move(location, delete, animate)
  116.         return p
  117.  
  118.     
  119.     def onRedraw(self):
  120.         '''Called by scene.cairo.Scene'''
  121.         if self.game.view is not None and self.game.view.controller is not None:
  122.             self.game.view.controller.render()
  123.         
  124.  
  125.     
  126.     def startAnimation(self):
  127.         '''Called by scene.cairo.Scene'''
  128.         self.game.application.ui.controller.startAnimation()
  129.  
  130.     
  131.     def getSquare(self, x, y):
  132.         '''Called by scene.human.SceneHumanInput'''
  133.         return self.controller.getSquare(x, y)
  134.  
  135.     
  136.     def playerIsHuman(self):
  137.         '''Called by scene.human.SceneHumanInput'''
  138.         return self.game.currentPlayerIsHuman()
  139.  
  140.     
  141.     def squareIsFriendly(self, coord):
  142.         '''Called by scene.human.SceneHumanInput'''
  143.         if self.playerIsHuman():
  144.             pass
  145.         return self.game.squareIsFriendly(coord)
  146.  
  147.     
  148.     def canMove(self, start, end):
  149.         '''Called by scene.human.SceneHumanInput'''
  150.         if self.playerIsHuman():
  151.             pass
  152.         return self.game.getCurrentPlayer().canMove(start, end)
  153.  
  154.     
  155.     def selectSquare(self, coord):
  156.         '''Called by scene.human.SceneHumanInput'''
  157.         self.view.setSelectedSquare(coord)
  158.  
  159.     
  160.     def moveHuman(self, start, end):
  161.         '''Called by scene.human.SceneHumanInput'''
  162.         self.game.moveHuman(start, end)
  163.  
  164.  
  165.  
  166. class OpenGLPiece(scene.ChessPieceFeedback):
  167.     '''
  168.     '''
  169.     model = None
  170.     location = ''
  171.     
  172.     def __init__(self, scene, piece):
  173.         self.scene = scene
  174.         self.piece = piece
  175.  
  176.     
  177.     def onDeleted(self):
  178.         '''Called by scene.ChessPieceFeedback'''
  179.         self.scene.pieces.pop(self.piece)
  180.  
  181.     
  182.     def onMoved(self):
  183.         '''Called by scene.ChessPieceFeedback'''
  184.         self.scene.view._pieceMoved(self)
  185.  
  186.  
  187.  
  188. class SceneOpenGL(scene.SceneFeedback, scene.human.SceneHumanInput):
  189.     '''
  190.     '''
  191.     game = None
  192.     pieces = None
  193.     waitingPiece = None
  194.     
  195.     def __init__(self, view):
  196.         '''Constructor for a glChess scene.
  197.         
  198.  
  199.         '''
  200.         self.view = view
  201.         self.game = view.game
  202.         self.pieces = { }
  203.         self.controller = scene.opengl.Scene(self)
  204.         scene.human.SceneHumanInput.__init__(self)
  205.  
  206.     
  207.     def getPieces(self):
  208.         return self.pieces.values()
  209.  
  210.     
  211.     def movePiece(self, piece, location, delete, animate):
  212.         '''
  213.         '''
  214.         
  215.         try:
  216.             p = self.pieces[piece]
  217.         except KeyError:
  218.             pieceName = {
  219.                 chess.board.PAWN: 'pawn',
  220.                 chess.board.ROOK: 'rook',
  221.                 chess.board.KNIGHT: 'knight',
  222.                 chess.board.BISHOP: 'bishop',
  223.                 chess.board.QUEEN: 'queen',
  224.                 chess.board.KING: 'king' }[piece.getType()]
  225.             chessSet = {
  226.                 chess.board.WHITE: 'white',
  227.                 chess.board.BLACK: 'black' }[piece.getColour()]
  228.             p = OpenGLPiece(self, piece)
  229.             p.model = self.controller.addChessPiece(chessSet, pieceName, location, p)
  230.             self.pieces[piece] = p
  231.  
  232.         p.location = location
  233.         p.model.move(location, delete)
  234.         return p
  235.  
  236.     
  237.     def onRedraw(self):
  238.         '''Called by scene.opengl.Scene'''
  239.         if self.game.view is not None and self.game.view.controller is not None:
  240.             self.game.view.controller.render()
  241.         
  242.  
  243.     
  244.     def startAnimation(self):
  245.         '''Called by scene.opengl.Scene'''
  246.         self.game.application.ui.controller.startAnimation()
  247.  
  248.     
  249.     def getSquare(self, x, y):
  250.         '''Called by scene.human.SceneHumanInput'''
  251.         return self.controller.getSquare(x, y)
  252.  
  253.     
  254.     def playerIsHuman(self):
  255.         '''Called by scene.human.SceneHumanInput'''
  256.         return self.game.currentPlayerIsHuman()
  257.  
  258.     
  259.     def squareIsFriendly(self, coord):
  260.         '''Called by scene.human.SceneHumanInput'''
  261.         if self.playerIsHuman():
  262.             pass
  263.         return self.game.squareIsFriendly(coord)
  264.  
  265.     
  266.     def canMove(self, start, end):
  267.         '''Called by scene.human.SceneHumanInput'''
  268.         if self.playerIsHuman():
  269.             pass
  270.         return self.game.getCurrentPlayer().canMove(start, end)
  271.  
  272.     
  273.     def selectSquare(self, coord):
  274.         '''Called by scene.human.SceneHumanInput'''
  275.         self.view.setSelectedSquare(coord)
  276.  
  277.     
  278.     def moveHuman(self, start, end):
  279.         '''Called by scene.human.SceneHumanInput'''
  280.         self.game.moveHuman(start, end)
  281.  
  282.  
  283.  
  284. class Splashscreen(ui.ViewFeedback):
  285.     '''
  286.     '''
  287.     application = None
  288.     scene = None
  289.     
  290.     def __init__(self, application):
  291.         """Constructor.
  292.         
  293.         'application' is ???
  294.         """
  295.         self.application = application
  296.         self.cairoScene = scene.cairo.Scene(self)
  297.         self.scene = scene.opengl.Scene(self)
  298.  
  299.     
  300.     def updateRotation(self, animate = True):
  301.         boardView = config.get('board_view')
  302.         if boardView == 'black':
  303.             rotation = 180
  304.         else:
  305.             rotation = 0
  306.         self.cairoScene.controller.setBoardRotation(rotation, animate)
  307.         self.scene.controller.setBoardRotation(rotation, animate)
  308.  
  309.     
  310.     def onRedraw(self):
  311.         '''Called by scene.SceneFeedback'''
  312.         if self.controller is not None:
  313.             self.controller.render()
  314.         
  315.  
  316.     
  317.     def showBoardNumbering(self, showNumbering):
  318.         '''Called by ui.ViewFeedback'''
  319.         self.scene.showBoardNumbering(showNumbering)
  320.         self.cairoScene.showBoardNumbering(showNumbering)
  321.  
  322.     
  323.     def showMoveHints(self, showHints):
  324.         '''Called by ui.ViewFeedback'''
  325.         pass
  326.  
  327.     
  328.     def renderGL(self):
  329.         '''Called by ui.ViewFeedback'''
  330.         self.scene.render()
  331.  
  332.     
  333.     def renderCairoStatic(self, context):
  334.         '''Called by ui.ViewFeedback'''
  335.         return self.cairoScene.renderStatic(context)
  336.  
  337.     
  338.     def renderCairoDynamic(self, context):
  339.         '''Called by ui.ViewFeedback'''
  340.         self.cairoScene.renderDynamic(context)
  341.  
  342.     
  343.     def reshape(self, width, height):
  344.         '''Called by ui.ViewFeedback'''
  345.         self.scene.reshape(width, height)
  346.         self.cairoScene.reshape(width, height)
  347.  
  348.     
  349.     def select(self, x, y):
  350.         pass
  351.  
  352.     
  353.     def deselect(self, x, y):
  354.         pass
  355.  
  356.     
  357.     def selectSquare(self, coord):
  358.         pass
  359.  
  360.     
  361.     def undo(self):
  362.         '''Called by ui.ViewFeedback'''
  363.         pass
  364.  
  365.     
  366.     def resign(self):
  367.         '''Called by ui.ViewFeedback'''
  368.         pass
  369.  
  370.     
  371.     def claimDraw(self):
  372.         '''Called by ui.ViewFeedback'''
  373.         pass
  374.  
  375.     
  376.     def setMoveNumber(self, moveNumber):
  377.         '''Called by ui.ViewFeedback'''
  378.         pass
  379.  
  380.  
  381.  
  382. class View(ui.ViewFeedback):
  383.     '''
  384.     '''
  385.     controller = None
  386.     
  387.     def __init__(self, game):
  388.         """Constructor.
  389.         
  390.         'game' is the game this view is rendering
  391.         """
  392.         self.game = game
  393.         self.moveNumber = -1
  394.         self.selectedCoord = None
  395.         self.showHints = False
  396.         self.showNumbering = False
  397.         self.doSmooth = False
  398.         self.highlightParams = (None, None, None, None)
  399.         self.changedHighlight = True
  400.         self.scene = SceneCairo(self)
  401.         config.watch('board_view', self._View__onBoardViewChanged)
  402.         movePlayer = MovePlayer(self)
  403.         game.addSpectator(movePlayer)
  404.  
  405.     
  406.     def setSelectedSquare(self, coord):
  407.         if self.selectedCoord == coord:
  408.             return None
  409.         self.selectedCoord = coord
  410.         self._redrawHighlight()
  411.  
  412.     
  413.     def _redrawHighlight(self):
  414.         self.changedHighlight = True
  415.         if self.controller is not None:
  416.             self.controller.render()
  417.         
  418.  
  419.     
  420.     def __onBoardViewChanged(self, key, value):
  421.         self.updateRotation()
  422.  
  423.     
  424.     def _updateHighlight(self, coord):
  425.         if self.moveNumber == -1:
  426.             player = self.game.getCurrentPlayer()
  427.             if player is self.game.getWhite():
  428.                 colour = chess.board.WHITE
  429.             else:
  430.                 colour = chess.board.BLACK
  431.         elif self.moveNumber % 2 == 0:
  432.             colour = chess.board.WHITE
  433.         else:
  434.             colour = chess.board.BLACK
  435.         params = (colour, self.moveNumber, self.selectedCoord, self.showHints)
  436.         if self.highlightParams == params:
  437.             return None
  438.         self.highlightParams = params
  439.         highlights = { }
  440.         if self.showHints:
  441.             for file in '12345678':
  442.                 for rank in 'abcdefgh':
  443.                     c = rank + file
  444.                     highlight = None
  445.                     if self.game.board.squareUnderAttack(colour, c, moveNumber = self.moveNumber):
  446.                         highlight = scene.HIGHLIGHT_THREATENED
  447.                     elif coord is not None:
  448.                         move = self.game.board.testMove(colour, coord, c, moveNumber = self.moveNumber)
  449.                         if move is not None:
  450.                             if self.game.board.getPiece(c, self.moveNumber):
  451.                                 highlight = scene.HIGHLIGHT_CAN_TAKE
  452.                             else:
  453.                                 highlight = scene.HIGHLIGHT_CAN_MOVE
  454.                         
  455.                     
  456.                     if highlight is not None:
  457.                         highlights[c] = highlight
  458.                         continue
  459.                 
  460.             
  461.         
  462.         if coord is not None:
  463.             highlights[coord] = scene.HIGHLIGHT_SELECTED
  464.         
  465.         self.scene.controller.setBoardHighlight(highlights)
  466.  
  467.     
  468.     def updateRotation(self, animate = True):
  469.         '''
  470.         '''
  471.         p = self.game.getCurrentPlayer()
  472.         if p is self.game.getWhite():
  473.             rotation = 0
  474.         elif p is self.game.getBlack():
  475.             rotation = 180
  476.         
  477.         boardView = config.get('board_view')
  478.         if boardView == 'white':
  479.             rotation = 0
  480.         elif boardView == 'black':
  481.             rotation = 180
  482.         elif boardView == 'human':
  483.             if not isinstance(p, player.HumanPlayer):
  484.                 return None
  485.         
  486.         self.scene.controller.setBoardRotation(rotation, animate)
  487.  
  488.     
  489.     def _pieceMoved(self, piece):
  490.         '''
  491.         '''
  492.         self._redrawHighlight()
  493.         if piece is not None and piece is self.scene.waitingPiece:
  494.             self.scene.waitingPiece = None
  495.             self.game.getCurrentPlayer().endMove()
  496.         
  497.  
  498.     
  499.     def showMoveHints(self, showHints):
  500.         '''Called by ui.ViewFeedback'''
  501.         self.showHints = showHints
  502.         self._redrawHighlight()
  503.  
  504.     
  505.     def showBoardNumbering(self, showNumbering):
  506.         '''Called by ui.ViewFeedback'''
  507.         self.showNumbering = showNumbering
  508.         self.scene.controller.showBoardNumbering(showNumbering)
  509.  
  510.     
  511.     def showSmooth(self, doSmooth):
  512.         '''Called by ui.ViewFeedback'''
  513.         self.doSmooth = doSmooth
  514.         self.scene.controller.showSmooth(doSmooth)
  515.  
  516.     
  517.     def updateScene(self, sceneClass):
  518.         '''
  519.         '''
  520.         if self.changedHighlight:
  521.             self._updateHighlight(self.selectedCoord)
  522.         
  523.         self.changedHighlight = False
  524.         if isinstance(self.scene, sceneClass):
  525.             return None
  526.         self._pieceMoved(None)
  527.         self.scene = sceneClass(self)
  528.         self.reshape(self.width, self.height)
  529.         self.setMoveNumber(self.moveNumber)
  530.         self.showBoardNumbering(self.showNumbering)
  531.         self.showSmooth(self.doSmooth)
  532.         self.updateRotation(animate = False)
  533.  
  534.     
  535.     def renderGL(self):
  536.         '''Called by ui.ViewFeedback'''
  537.         self.updateScene(SceneOpenGL)
  538.         self.scene.controller.render()
  539.  
  540.     
  541.     def renderCairoStatic(self, context):
  542.         '''Called by ui.ViewFeedback'''
  543.         self.updateScene(SceneCairo)
  544.         return self.scene.controller.renderStatic(context)
  545.  
  546.     
  547.     def renderCairoDynamic(self, context):
  548.         '''Called by ui.ViewFeedback'''
  549.         self.updateScene(SceneCairo)
  550.         self.scene.controller.renderDynamic(context)
  551.  
  552.     
  553.     def reshape(self, width, height):
  554.         '''Called by ui.ViewFeedback'''
  555.         self.width = width
  556.         self.height = height
  557.         self.scene.controller.reshape(width, height)
  558.  
  559.     
  560.     def select(self, x, y):
  561.         '''Called by ui.ViewFeedback'''
  562.         self.scene.select(x, y)
  563.  
  564.     
  565.     def deselect(self, x, y):
  566.         '''Called by ui.ViewFeedback'''
  567.         self.scene.deselect(x, y)
  568.  
  569.     
  570.     def setMoveNumber(self, moveNumber):
  571.         '''Called by ui.ViewFeedback'''
  572.         self.moveNumber = moveNumber
  573.         self.scene.enableHumanInput(moveNumber == -1)
  574.         piecesByLocation = self.game.getAlivePieces(moveNumber)
  575.         requiredPieces = piecesByLocation.values()
  576.         for piece in self.scene.getPieces():
  577.             
  578.             try:
  579.                 requiredPieces.index(piece.piece)
  580.             continue
  581.             except ValueError:
  582.                 piece.model.move(piece.location, True)
  583.                 continue
  584.             
  585.  
  586.         
  587.         for location, piece in piecesByLocation.iteritems():
  588.             self.scene.movePiece(piece, location, False, True)
  589.         
  590.         if moveNumber != -1:
  591.             self._pieceMoved(piece)
  592.         
  593.         self._redrawHighlight()
  594.  
  595.     
  596.     def save(self, fileName = None):
  597.         '''Called by ui.ViewFeedback'''
  598.         if fileName is not None:
  599.             if self.game.inHistory:
  600.                 self.game.inHistory = False
  601.                 if self.game.fileName is not None:
  602.                     self.game.application.history.rename(self.game.fileName, fileName)
  603.                 
  604.             
  605.             self.game.fileName = fileName
  606.         
  607.         return self.game.save()
  608.  
  609.     
  610.     def getFileName(self):
  611.         '''Called by ui.ViewFeedback'''
  612.         if self.game.inHistory:
  613.             return None
  614.         return self.game.fileName
  615.  
  616.     
  617.     def undo(self):
  618.         '''Called by ui.ViewFeedback'''
  619.         p = self.game.getHumanPlayer()
  620.         if p is not None:
  621.             p.undo()
  622.         
  623.  
  624.     
  625.     def resign(self):
  626.         '''Called by ui.ViewFeedback'''
  627.         p = self.game.getHumanPlayer()
  628.         if p is None:
  629.             self.game.abandon()
  630.         else:
  631.             p.resign()
  632.  
  633.     
  634.     def claimDraw(self):
  635.         '''Called by ui.ViewFeedback'''
  636.         p = self.game.getHumanPlayer()
  637.         if p is None:
  638.             return False
  639.         return p.claimDraw()
  640.  
  641.  
  642.